package org.aug.demo.jvm.classpath;

import org.aug.demo.jvm.classpath.impl.CompositeEntry;
import org.aug.demo.jvm.classpath.impl.DirEntry;
import org.aug.demo.jvm.classpath.impl.WildcardEntry;
import org.aug.demo.jvm.classpath.impl.ZipEntry;

import java.io.File;
import java.io.IOException;

    /*此方法留给具体类来实现，负责寻找和加载class文件；
    注意这个方法的参数是 class 的相对路径，例如读取 java.lang.Object 类，应传入 java/lang/Object；
    */
public interface Entry {
    byte[] readClass(String className) throws IOException;

    //静态方法 create() 根据传入的路径字符串，来判断具体创建哪种实现类；
    static Entry create(String path) {
        //File.pathSeparator: 路径分隔符（win\linux)
        if(path.contains(File.pathSeparator)){  //混合形式 通常以文件分隔符（如;）分割的多个路径
            return new CompositeEntry(path);
        }

        if(path.endsWith("*")){     //通配符形式
            return new WildcardEntry(path);
        }

        //压缩包形式
        if(path.endsWith(".jar") || path.endsWith(".JAR") ||
                path.endsWith(".zip") || path.endsWith(".ZIP")){
            return new ZipEntry(path);
        }

        //目录形式
        return new DirEntry(path);
    }

}
